#include "tio_intf_c.h"
#include "tio.h"

#define FUNC_SET_TIO_1(func_name, val) \
    int func_name(val data)            \
    {                                  \
        rtdev::TIO* s = nullptr;       \
        s = rtdev::get_TIO();          \
        if (!s)                        \
        {                              \
            return -1;                 \
        }                              \
        return s->func_name(data);     \
    }

FUNC_SET_TIO_1(tio_set_lamp, TIOLampColor)
FUNC_SET_TIO_1(tio_set_vout_enable, int)
FUNC_SET_TIO_1(tio_set_vout_voltage, int)
FUNC_SET_TIO_1(tio_set_rs485_chn_func, int)
FUNC_SET_TIO_1(tio_setup_di_pin, uint32_t);
FUNC_SET_TIO_1(tio_setup_do_pin, uint32_t);
FUNC_SET_TIO_1(tio_setup_ai_pin, uint32_t);

TIOStatus tio_status()
{
    rtdev::TIO* s = nullptr;
    s = rtdev::get_TIO();
    if (!s)
    {
        TIOStatus data = {};
        return data;
    }
    return s->get_tio_status();
    ;
}

TIOSetting get_tio_settings()
{
    rtdev::TIO* s = nullptr;
    s = rtdev::get_TIO();
    if (!s)
    {
        TIOSetting data = {};
        return data;
    }
    return s->get_tio_settings();
}

int reset_tio()
{
    rtdev::TIO* s = nullptr;
    s = rtdev::get_TIO();
    if (!s)
    {
        return -1;
    }
    return 0;
    s->reset_tio();
}

int tio_query_version()
{
    rtdev::TIO* s = nullptr;
    s = rtdev::get_TIO();
    if (!s)
    {
        return -1;
    }
    s->query_Tio_version();
    return 0;
}

int set_tio_rs485_chn_mode(int chn, int mode)
{
    rtdev::TIO* s = nullptr;
    s = rtdev::get_TIO();
    if (!s)
    {
        return -1;
    }
    return s->set_tio_rs485_chn_mode(chn, (rtdev::TIO::RS485Mode)mode);
}

int set_tio_rs485_chn_comm(int chn, int baudrate, int databit, int stopbit, char parity)
{
    rtdev::TIO* s = nullptr;
    s = rtdev::get_TIO();
    if (!s)
    {
        return -1;
    }
    return s->set_tio_rs485_chn_comm(chn, baudrate, databit, stopbit, parity);
}

int tio_set_dout(int index, int dout)
{
    rtdev::TIO* s = nullptr;
    s = rtdev::get_TIO();
    if (!s)
    {
        return -1;
    }
    return s->tio_set_dout(index, dout);
    return 0;
}
